package Metier;

import java.util.ArrayList;
import java.util.List;

import javax.swing.text.BadLocationException;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import org.jdom.Attribute;
import org.jdom.Element;
import org.jdom.Text;

/**
 * Classe de gestion des paragraphes
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class Paragraphe extends Element {

	/**
	 * StyledDocument contenant le paragraphe mis en forme
	 * @see Paragraphe#getStyleDoc()
	 * @see Paragraphe#modifier(StyledDocument)
	 */
	private StyledDocument doc;
	
	/**
	 * Constructeur de la classe Paragraphe depuis un StyledDocument
	 * @param style	styledDocument contenant le paragraphe mis en forme
	 */
	public Paragraphe(StyledDocument style) {
		super("paragraphe");
	
		this.doc = style;

		String s="";
		String car="";
		Element ligne=new Element("ligne");
		
		for(int i=0;i<doc.getLength();i++){
			try {
				car=doc.getText(i,1);
			} catch (BadLocationException ex) {
				ex.printStackTrace();
			}
			
			if(car.equals("\n")){
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).setText(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){ 
					ligne.addContent(s);
				}
				ligne.addContent(new Element("br"));
				s="";
				if(StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes())!=StyleConstants.getAlignment(doc.getCharacterElement(i+1).getAttributes())){
					switch (StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes()))
					{
						case 1:	ligne.setName("align-centre");
								break;
						case 2:	ligne.setName("align-droite");
								break;
						case 3: ligne.setName("align-justifie");
								break;
						default:ligne.setName("align-gauche");
								break;
					}
					addContent(ligne);
					ligne=new Element("ligne");
				}
				else if(i==doc.getLength()-1){
					switch (StyleConstants.getAlignment(doc.getCharacterElement(i-1).getAttributes()))
					{
						case 1:	ligne.setName("align-centre");
								break;
						case 2:	ligne.setName("align-droite");
								break;
						case 3: ligne.setName("align-justifie");
								break;
						default:ligne.setName("align-gauche");
								break;
					}
					addContent(ligne);
				}
			}
			else if(i==doc.getLength()-1){
				s+=car;
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).addContent(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){
					ligne.addContent(s);
				}
				switch (StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes()))
				{
					case 1:	ligne.setName("align-centre");
							break;
					case 2:	ligne.setName("align-droite");
							break;
					case 3: ligne.setName("align-justifie");
							break;
					default:ligne.setName("align-gauche");
							break;
				}
				addContent(ligne);
			}
			else if(doc.getCharacterElement(i).getAttributes()==doc.getCharacterElement(i+1).getAttributes()){
				s+=car;
			}
			else if(doc.getCharacterElement(i).getAttributes()!=doc.getCharacterElement(i+1).getAttributes()){
				s+=car;
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).addContent(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){
					ligne.addContent(s);
				}
				s="";
			}
		}
	}
	
	/**
	 * Permet de recuperer le styledDocument du paragraphe
	 * @return	le StyledDocument lié au paragraphe
	 */
	public StyledDocument getStyleDoc() { return doc;}
	
	/**
	 * Permet de remplacer le styledDocument(contenu) du paragraphe
	 * @param style nouveau StyledDocument à lier au paragraphe
	 */
	public void modifier(StyledDocument style){
		doc=style;
		String s="";
		String car="";
		Element ligne=new Element("ligne");
		
		for(int i=0;i<doc.getLength();i++){
			try {
				car=doc.getText(i,1);
			} catch (BadLocationException ex) {
				ex.printStackTrace();
			}
			
			if(car.equals("\n")){
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).setText(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){ 
					ligne.addContent(s);
				}
				ligne.addContent(new Element("br"));
				s="";
				if(StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes())!=StyleConstants.getAlignment(doc.getCharacterElement(i+1).getAttributes())){
					switch (StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes()))
					{
						case 1:	ligne.setName("align-centre");
								break;
						case 2:	ligne.setName("align-droite");
								break;
						case 3: ligne.setName("align-justifie");
								break;
						default:ligne.setName("align-gauche");
								break;
					}
					addContent(ligne);
					ligne=new Element("ligne");
				}
				else if(i==doc.getLength()-1){
					switch (StyleConstants.getAlignment(doc.getCharacterElement(i-1).getAttributes()))
					{
						case 1:	ligne.setName("align-centre");
								break;
						case 2:	ligne.setName("align-droite");
								break;
						case 3: ligne.setName("align-justifie");
								break;
						default:ligne.setName("align-gauche");
								break;
					}
					addContent(ligne);
				}
			}
			else if(i==doc.getLength()-1){
				s+=car;
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).addContent(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){
					ligne.addContent(s);
				}
				switch (StyleConstants.getAlignment(doc.getCharacterElement(i).getAttributes()))
				{
					case 1:	ligne.setName("align-centre");
							break;
					case 2:	ligne.setName("align-droite");
							break;
					case 3: ligne.setName("align-justifie");
							break;
					default:ligne.setName("align-gauche");
							break;
				}
				addContent(ligne);
			}
			else if(doc.getCharacterElement(i).getAttributes()==doc.getCharacterElement(i+1).getAttributes()){
				s+=car;
			}
			else if(doc.getCharacterElement(i).getAttributes()!=doc.getCharacterElement(i+1).getAttributes()){
				s+=car;
				ArrayList<Element> alE=new ArrayList<Element>();
				if(StyleConstants.isBold(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("g"));
				}
				if(StyleConstants.isItalic(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("i"));
				}
				if(StyleConstants.isUnderline(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("s"));
				}
				if(StyleConstants.isStrikeThrough(doc.getCharacterElement(i).getAttributes())){
					alE.add(new Element("b"));
				}
				
				if(alE.size()!=0 && !s.isEmpty()){
					for(int j=alE.size()-1;j>=0;j--){
						if(j==alE.size()-1){
							alE.get(j).addContent(s);
						}
						else{
							alE.get(j).addContent(alE.get(j+1));
						}
					}
					ligne.addContent(alE.get(0));
				}
				else if(!s.isEmpty()){
					ligne.addContent(s);
				}
				s="";
			}
		}
	}
}
